package krow.dev.gunpobus.util;

public class InitialSearcher {
	private static final char FIRST_UNICODE = 44032; // 가
	private static final char LAST_UNICODE = 55203; // 힣
	private static final char BASE_UNIT = 588;// 각자음 마다 가지는 글자수
	private static final char[] INITIAL_SOUND = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };

	private InitialSearcher() {

	}

	public static char getFirstElement(char character) {
		if (!isKorean(character))
			return character;
		return INITIAL_SOUND[(character - 0xAC00) / (21 * 28)];
	}

	public static boolean match(String value, String search) {
		int index = 0;
		int offset = value.length() - search.length();
		int slen = search.length();
		if (offset < 0)
			return false; // 검색어가 더 길면 false를 리턴한다.
		for (int i = 0; i <= offset; i++) {
			index = 0;
			while (index < slen) {
				if (isInitialSound(search.charAt(index)) == true && isKorean(value.charAt(i + index))) {
					// 만약 현재 char이 초성이고 value가 한글이면
					if (getInitialSound(value.charAt(i + index)) == search.charAt(index))
						// 각각의 초성끼리 같은지 비교한다
						index++;
					else
						break;
				} else {
					// char이 초성이 아니라면
					if (value.charAt(i + index) == search.charAt(index))
						// 그냥 같은지 비교한다.
						index++;
					else
						break;
				}
			}
			if (index == slen)
				return true;
		}
		return false;
	}

	private static boolean isInitialSound(char searchString) {
		for (char c : INITIAL_SOUND) {
			if (c == searchString) {
				return true;
			}
		}
		return false;
	}

	private static char getInitialSound(char character) {
		int startIndex = (character - FIRST_UNICODE);
		int index = startIndex / BASE_UNIT;

		return INITIAL_SOUND[index];
	}

	private static boolean isKorean(char character) {

		return FIRST_UNICODE <= character && character <= LAST_UNICODE;
	}
}